package com.gitee.wsl.transform.validator.sample

import com.gitee.wsl.ext.matcher
import com.gitee.wsl.ext.string.hide
import com.gitee.wsl.text.regex.sample.MOBILE
import com.gitee.wsl.text.regex.sample.MOBILE_HK
import com.gitee.wsl.text.regex.sample.MOBILE_MO
import com.gitee.wsl.text.regex.sample.MOBILE_TW
import com.gitee.wsl.text.regex.sample.TEL
import com.gitee.wsl.text.regex.sample.TEL_400_800


/**
 * 电话号码工具类，包括：
 *
 *  * 手机号码
 *  * 400、800号码
 *  * 座机号码
 *
 *
 * @author dahuoyzs
 * @since 5.3.11
 */
object PhoneUtil {
    /**
     * 验证是否为手机号码（中国大陆）
     *
     * @param value 值
     * @return 是否为手机号码（中国大陆）
     * @since 5.3.11
     */
    fun isMobile(value: CharSequence): Boolean {
        return Regex.MOBILE.matches(value)
    }

    /**
     * 验证是否为手机号码（中国香港）
     * @param value 手机号码
     * @return 是否为中国香港手机号码
     * @since 5.6.3
     * @author dazer, ourslook
     */
    fun isMobileHk(value: CharSequence): Boolean {
        return Regex.MOBILE_HK.matches(value)
    }

    /**
     * 验证是否为手机号码（中国台湾）
     * @param value 手机号码
     * @return 是否为中国台湾手机号码
     * @since 5.6.6
     * @author ihao
     */
    fun isMobileTw(value: CharSequence): Boolean {
        return Regex.MOBILE_TW.matches(value)
    }

    /**
     * 验证是否为手机号码（中国澳门）
     * @param value 手机号码
     * @return 是否为中国澳门手机号码
     * @since 5.6.6
     * @author ihao
     */
    fun isMobileMo(value: CharSequence): Boolean {
        return Regex.MOBILE_MO.matches(value)
    }

    /**
     * 验证是否为座机号码（中国大陆）
     *
     * @param value 值
     * @return 是否为座机号码（中国大陆）
     * @since 5.3.11
     */
    fun isTel(value: CharSequence): Boolean {
        return Regex.TEL.matches(value)
    }

    /**
     * 验证是否为座机号码（中国大陆）+ 400 + 800
     *
     * @param value 值
     * @return 是否为座机号码（中国大陆）
     * @since 5.6.3
     * @author dazer, ourslook
     */
    fun isTel400800(value: CharSequence): Boolean {
        return Regex.TEL_400_800.matches(value)
    }

    /**
     * 验证是否为座机号码+手机号码（CharUtil中国）+ 400 + 800电话 + 手机号号码（中国香港）
     *
     * @param value 值
     * @return 是否为座机号码+手机号码（中国大陆）+手机号码（中国香港）+手机号码（中国台湾）+手机号码（中国澳门）
     * @since 5.3.11
     */
    fun isPhone(value: CharSequence): Boolean {
        return isMobile(value) || isTel400800(value) || isMobileHk(value) || isMobileTw(value) || isMobileMo(value)
    }

    /**
     * 隐藏手机号前7位  替换字符为"*"
     * 栗子
     *
     * @param phone 手机号码
     * @return 替换后的字符串
     * @since 5.3.11
     */
    fun hideBefore(phone: CharSequence): CharSequence {
        return phone.hide(0, 7)
    }

    /**
     * 隐藏手机号中间4位  替换字符为"*"
     *
     * @param phone 手机号码
     * @return 替换后的字符串
     * @since 5.3.11
     */
    fun hideBetween(phone: CharSequence): CharSequence {
        return phone.hide( 3, 7)
    }

    /**
     * 隐藏手机号最后4位  替换字符为"*"
     *
     * @param phone 手机号码
     * @return 替换后的字符串
     * @since 5.3.11
     */
    fun hideAfter(phone: CharSequence): CharSequence {
        return phone.hide(7, 11)
    }

    /**
     * 获取手机号前3位
     *
     * @param phone 手机号码
     * @return 手机号前3位
     * @since 5.3.11
     */
    fun subBefore(phone: CharSequence): CharSequence {
        return phone.substring( 0, 3)
    }

    /**
     * 获取手机号中间4位
     *
     * @param phone 手机号码
     * @return 手机号中间4位
     * @since 5.3.11
     */
    fun subBetween(phone: CharSequence): CharSequence {
        return phone.substring( 3, 7)
    }

    /**
     * 获取手机号后4位
     *
     * @param phone 手机号码
     * @return 手机号后4位
     * @since 5.3.11
     */
    fun subAfter(phone: CharSequence): CharSequence {
        return phone.substring( 7, 11)
    }

    /**
     * 获取固话号码中的区号
     *
     * @param value 完整的固话号码
     * @return 固话号码的区号部分
     * @since 5.7.7
     */
    fun subTelBefore(value: CharSequence): CharSequence? {
        return Regex.TEL.matchEntire(value)?.groups[1]?.value
        //return ReUtil.getGroup1(PatternPool.TEL, value)
    }

    /**
     * 获取固话号码中的号码
     *
     * @param value 完整的固话号码
     * @return 固话号码的号码部分
     * @since 5.7.7
     */
    fun subTelAfter(value: CharSequence): CharSequence? {
        return Regex.TEL.matchEntire(value)?.groups[2]?.value
        //return ReUtil.get(PatternPool.TEL, value, 2)
    }
}
